package com.bright.hxj.cwduijie.manager;

import com.bright.hxj.cwduijie.enums.DataApi;
import com.bright.hxj.cwduijie.pojo.command.*;
import com.bright.hxj.cwduijie.pojo.dto.*;
import com.bright.hxj.cwduijie.pojo.po.DuijieCheck;
import com.bright.hxj.cwduijie.pojo.po.DuijieProcLog;
import com.bright.hxj.cwduijie.pojo.query.BatchQuery;
import com.bright.hxj.cwduijie.pojo.query.PageQuery;

import java.util.Date;
import java.util.List;
import java.util.Optional;

/**
 * @Author hxj
 * @Date 2024/7/8 18:05
 * @Description
 */
public interface DuijieManager {

//    /**
//     * 获取需要对接的账套
//     * @return
//     */
//    List<DuijieZbDto> getNeedDuijieData();
//
//    /**
//     * 获取需要对接附件的数据
//     * @return
//     */
//    List<DuijieZbDto> getNeedDuijieFileData();

    /**
     * 获取需要查询异步任务的数据
     *
     * @return
     */
    List<DuijieAsyncDto> getNeedCheckAsyncTasksData();

    Optional<DuijieAsyncDto> getDuijieAsyncById(Integer id);

    void saveDuijieIdTaskId(List<DuijieIdTaskidDto> duijieIdTaskidDtos);

    /**
     * 保存数据交换标志
     */
    void saveSjjhbzToDataTable();

    /**
     * 根据id和表名更新sjjhbz和taskId
     * @param saveSendDataResultCommand
     */
    void saveSendDataResult(SaveSendDataResultCommand saveSendDataResultCommand);

//    void saveSendDataResult(List<SaveSendDataResultCommand> saveSendDataResultCommand);

    /**
     * 批量同步sjjhbz回写到各表 注意 saveSendDataResultCommand只用到了dataApi参数 全表更新 不再限制id和taskId
     * @param saveSendDataResultCommand
     */
    void updateSendDataResultStatus(SaveSendDataResultCommand saveSendDataResultCommand);

    /**
     * 保存异步任务的任务ID 这个方法仅用于新增
     * @param saveTaskIdCommand
     */
    void saveAsyncTaskId(SaveTaskIdCommand saveTaskIdCommand);

    /**
     * 保存异步任务的任务ID 这个方法仅用于新增
     * @param saveTaskIdCommand
     */
    void saveAsyncTaskId(List<SaveTaskIdCommand> saveTaskIdCommand);

    /**
     * 这个是批量更新异步任务执行结果的 不会新增
     * @param saveTaskIdCommand
     */
    void updateAsyncTaskStatus(SaveTaskIdCommand saveTaskIdCommand);

    /**
     * 保存数据对接内容的日志
     * @param saveLogCommand
     */
//    @Deprecated
//    void saveDataLog(SaveLogCommand saveLogCommand);

    /**
     * 对接开始时初始化批次数据 新建所有批次的数据记录
     * @param command
     * @return 返回第一批的批次id
     */
    DuijieBatchDto createBatchData(CreateBatchDataCommand command);

    /**
     * 按月份进行批次推送
     * @param command
     * @return
     */
    String createOrderByMonthBatchData(CreateBatchDataCommand command);

    /**
     * 获取所有还在排队中的的批次数据
     * @return
     */
    List<DuijieBatchDto> getExecutingBatches();

    /**
     * 获取所有需要对接的批次
     * @return
     */
    List<DuijieBatchDto> getNeedDuijieBatches();

    /**
     * 按batchId获取所有异步任务
     * @param batchQuery
     * @return
     */
    List<DuijieAsyncDto> getCheckAsyncTasksByBatchId(BatchQuery batchQuery);

    /**
     * 按batchId将该批次设置为需要对接
     * @param nextBatchId
     */
    void updateNextBatchDataToDuijie(String nextBatchId);

    /**
     * 保存批次数据
     * @param batches
     */
    void saveBatchData(List<DuijieBatchDto> batches);

    void saveBatchData(DuijieBatchDto batch);

    /**
     * 推送删除 那些DUIJIE_DATA_KEYS还在 但中间表已经删除了的数据
     * @param serviceCode
     * @return
     */
    List<String> getDataKeysAlreadyDeleted(String serviceCode);

    List<DuijieDataKeysDto> getDuijieDataKeysLike(String serviceCode, String dataKey);

    /**
     * 写入已对接的dataKeys进中间表
     * @param duijieDataKeysDtos
     */
    void saveDuijieDataKeys(List<DuijieDataKeysDto> duijieDataKeysDtos);

    /**
     * 删除已推送删除的dataKeys
     * @param command
     */
    void deleteDuijieDataKeys(DeleteDataKeysCommand command);

    /**
     * 保存校验结果记录
     * @param duijieChecks
     */
    void saveCheckErrorResults(List<DuijieCheck> duijieChecks);


    /**
     * 获取这个writeDate开始的所有duijie_async数据 如果writeDate为空 默认从今天0时开始
     * @param checkStartDate
     * @return
     */
    List<DuijieAsyncDto> getAsyncTasksDataByWriteDate(Date checkStartDate);

    <T> T getVarByKey(String varKey, Class<T> clazz);

    void saveVarByKey(String varKey, Object var);

    Long getNeedSendDataResultStatusCount(String tableName);

    void updateOpTypeAndSjjhbzByIds(UpdateOpTypeSjjhbzCommand command, DataApi dataApi);

    void executeUpdateSql(ExecuteUpdateSqlCommand command);

    DuijieProcLog createAndSaveNewDuijieProcLog(BuildWithProcCommand command);

    void saveDuijieProcLog(DuijieProcLog log, CheckResultDto resultDto, boolean isInterrupted);

    void saveDuijieProcLog(Integer id, CheckResultDto resultDto, boolean isInterrupted);

    PageDTO<DuijieProcLog> getProcLogs(PageQuery duijieQuery);
}
